package com.xhl.gateway.config;

import com.alibaba.fastjson.JSON;
import com.xhl.gateway.entity.WhiteList;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Description 该类在 ioc 容器中的名称就是配置文件在 nacos 中的 dataId
 * @Author xhl
 * @Date 2022/12/26 13:31
 **/
@Component(WhiteListConfig.dataId)
public class WhiteListConfig extends AbstractNacosConfig {

    // key 是服务名，value 是该服务下不需要校验的接口。涉及到并发，因此采用写时复制的 map 结构
//    private Map<String, List<String>> whiteListMap = new CopyOnWriteMap<>();
    private Map<String, List<String>> whiteListMap = new HashMap<>();
    // 和 nacos 的 dataId 对应上
    static final String dataId = "white_list";


    @Override
    public void onReceived(String content) {

        // 将 json 格式转为 WhiteList 集合
        List<WhiteList> whiteLists = JSON.parseArray(content, WhiteList.class);

        Map<String, List<String>> listMap = whiteLists.stream().collect(Collectors.toMap(WhiteList::getServiceName, WhiteList::getUrls));

        // 原有的白名单集合
        Set<String> keySet = whiteListMap.keySet();
        // 修改后的白名单集合
        Set<String> newKeySet = listMap.keySet();

        List<String> keys = new ArrayList<>(newKeySet);
        // 被移除掉的白名单集合
        List<String> removeKeys = new ArrayList<>();

        for (String key : keySet) {

            if (!newKeySet.contains(key)){
                removeKeys.add(key);
            }
        }

        for (String removeKey : removeKeys) {
            whiteListMap.remove(removeKey);
        }

        for (String key : keys) {
            whiteListMap.put(key,listMap.get(key));
        }

    }

    @Override
    public String getDataId() {
        return dataId;
    }
    public Map<String, List<String>> getWhiteListMap(){
        return whiteListMap;
    }
}